/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.eventos.adapaters.CalendarioAmbientesAdapter;
import org.cip.esymons.eventos.bc.CursoDelegate;
import org.cip.esymons.eventos.bc.EventoDelegate;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.bc.ReservaAmbienteDelegate;
import org.cip.esymons.eventos.be.Ambiente;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.eventos.be.ReservaAmbiente;
import org.cip.esymons.eventos.be.ServicioEquipo;
import org.cip.esymons.general.util.ControladorAbstracto;

/**
 *
 * @author Lizardo Rios
 */
public class ReservaEventoController {

    //<editor-fold defaultstate="collapsed" desc="Variables de Inicio">
    PreEventoDelegate delegate;
    EventoDelegate delegateEvento;
    CursoDelegate delegateCurso;
    ReservaAmbienteDelegate delegateReserva;
    Preevento preEventoSeleccionado;
    Date fechaAmbiente = null;
    Ambiente ambiente;
    ServicioEquipo equipo;
    List<CalendarioAmbientesAdapter> listaCalendario;
    List<CalendarioAmbientesAdapter> listaCalendario1;
    CalendarioAmbientesAdapter ambienteSeleccionado;
    String tipoAmbiente = "1";
    
    // // </editor-fold>
    public ReservaEventoController() {
        inicializar();
    }

    //<editor-fold defaultstate="collapsed" desc="Inicializar">
    public String inicializar() {
        delegateEvento = new EventoDelegate();
        delegateCurso = new CursoDelegate();
        delegate = new PreEventoDelegate();
        delegateReserva = new ReservaAmbienteDelegate();
        listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();
        listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
        preEventoSeleccionado = new Preevento();
        cargarEvento();
        fechaAmbiente = new Date();
        return null;
    }

    
    // // </editor-fold>
    //<editor-fold defaultstate="collapsed" desc="GET and SET">
    

    public CalendarioAmbientesAdapter getAmbienteSeleccionado() {
        return ambienteSeleccionado;
    }

    public void setAmbienteSeleccionado(CalendarioAmbientesAdapter ambienteSeleccionado) {
        this.ambienteSeleccionado = ambienteSeleccionado;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario() {
        return listaCalendario;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario1() {
        return listaCalendario1;
    }

    public void setListaCalendario1(List<CalendarioAmbientesAdapter> listaCalendario1) {
        this.listaCalendario1 = listaCalendario1;
    }

    public Preevento getPreEventoSeleccionado() {
        return preEventoSeleccionado;
    }

    public void setPreEventoSeleccionado(Preevento preEventoSeleccionado) {
        this.preEventoSeleccionado = preEventoSeleccionado;
    }

    public void setListaCalendario(List<CalendarioAmbientesAdapter> listaCalendario) {
        this.listaCalendario = listaCalendario;
    }

    public ServicioEquipo getEquipo() {
        return equipo;
    }

    public void setEquipo(ServicioEquipo equipo) {
        this.equipo = equipo;
    }

    public Ambiente getAmbiente() {
        return ambiente;
    }

    public void setAmbiente(Ambiente ambiente) {
        this.ambiente = ambiente;
    }

    public Date getFechaAmbiente() {
        return fechaAmbiente;
    }

    public void setFechaAmbiente(Date fechaAmbiente) {
        this.fechaAmbiente = fechaAmbiente;
    }

    public String getTipoAmbiente() {
        return tipoAmbiente;
    }

    public void setTipoAmbiente(String tipoAmbiente) {
        this.tipoAmbiente = tipoAmbiente;
    }

    
    // // </editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Validaciones">
    public String cargarEvento() {
        PreEventoController controller = (PreEventoController) ControladorAbstracto.getBean("PreEventoController");
        preEventoSeleccionado = controller.preEventoSeleccionado;
        listaCalendario1 =  controller.listaCalendario1;
        controller.listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();
        return null;
    }

    public boolean validarFechas(Date ini, Date fin) {
        try {
            if (!ini.equals(null)) {
                if (!fin.equals(null)) {
                    if (fin.compareTo(ini) >= 0) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return false;
    }

    public boolean validarStrings(String s) {
        if (!s.equals("") && !s.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

    //Metodo para mostrar mensajes en la pagina
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }
    // // </editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Ambientes Evento">
    public String listarAmbientesEstado() {
        try {
//            Calendar c = Calendar.getInstance();
//            c.setTime(new Date());
//            c.add(Calendar.DAY_OF_MONTH, 6);
//            int result = c.getTime().compareTo(fechaAmbiente);
//            System.out.println("result: " + result);
//            if (result <= 0) {
                List<ReservaAmbiente> listaReservas = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReservas = delegateReserva.listarReserva_Dia(fechaAmbiente, ambiente);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    boolean var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReservas) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setTipo(0);
                        adap.setAmbiente(ambiente);
                        adap.setNombre(ambiente.getAmbNombre());
                        listaCalendario.add(adap);
                    }
                }
//            }
//            else {
//                listaCalendario.clear();
//                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//                c.add(Calendar.DAY_OF_MONTH, 1);
//                String fecha = sdf.format(c.getTime());
//                mostrarMensaje("Error: ", "Los Ambientes se reservan con una semana antes de anticipacion  de la fecha Actual, ejemplo: " + fecha, FacesMessage.SEVERITY_ERROR);
//            }
        } catch (Exception e) {
            mostrarMensaje("Error: ", e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public String listarServiciosEstado() {
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH, 6);
        if (c.getTime().compareTo(fechaAmbiente) <= 0) {
            try {
                List<ReservaAmbiente> listaReservas = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReservas = delegateReserva.listarReserva_Dia(fechaAmbiente, equipo);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    boolean var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReservas) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setTipo(1);
                        adap.setServicio(equipo);
                        adap.setNombre(equipo.getSerNombre());
                        listaCalendario.add(adap);
                    }

                }
            } catch (Exception e) {
                System.out.println("Errorrr " + e.toString());
            }
        } else {
            listaCalendario.clear();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            c.add(Calendar.DAY_OF_MONTH, 1);
            String fecha = sdf.format(c.getTime());
            mostrarMensaje("Error: ", "Los Ambientes se reservan con una semana antes de anticipacion  de la fecha Actual, ejemplo: " + fecha, FacesMessage.SEVERITY_ERROR);
        }

        return null;
    }

    public String agregarAmbSeleccionados() {
        for (CalendarioAmbientesAdapter cal : listaCalendario) {
            if (cal.getReservar()) {
                cal.setFecha(fechaAmbiente);
                listaCalendario1.add(cal);
            }
        }
        for (CalendarioAmbientesAdapter cal : listaCalendario1) {
            listaCalendario.remove(cal);
        }
        return null;
    }

    public String quitarAmbSeleccionados() {
        try {
            listaCalendario.add(ambienteSeleccionado);
            listaCalendario1.remove(ambienteSeleccionado);
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "En quitar ambiente seleccionado", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public String modificarReservas() {
        try {
            if (listaCalendario1.size() > 0) {
                List<ReservaAmbiente> listaReservas = new ArrayList<ReservaAmbiente>();
                listaReservas = delegateReserva.listarReservaPorEvento(preEventoSeleccionado);
                for (ReservaAmbiente res : listaReservas) {
                    delegateReserva.eliminar(res);
                }
                for (CalendarioAmbientesAdapter cal : listaCalendario1) {
                    ReservaAmbiente res = new ReservaAmbiente();
                    res.setReaEstado("RESERVADO");
                    if (cal.getTipo() == 0) {
//                        res.setAmbCodigo(ambiente);           //corregido por lizardo
                        res.setAmbCodigo(cal.getAmbiente());    //corregido por lizardo
                    } else {
//                        res.setSerCodigo(equipo);             //corregido por lizardo
                        res.setSerCodigo(cal.getServicio());    //corregido por lizardo
                    }
                    res.setEveCodigo(preEventoSeleccionado);
//                    res.setReaFecha(fechaAmbiente); //corregido por lizardo
                    res.setReaFecha(cal.getFecha()); //corregido por lizardo
                    res.setReaTipoae(cal.getTipo());
                    res.setReaTipoec(0);
                    res.setReahoraInicio(cal.getHoraInicio());
                    res.setReahoraFin(cal.getHoraFin());
                    delegateReserva.registrar(res);
                }
                mostrarMensaje("Exito", "Se modifico correctamente los ambientes", FacesMessage.SEVERITY_INFO);
                inicializar();
            } else {
                mostrarMensaje("Error", "Seleccione por lo menos un ambiente", FacesMessage.SEVERITY_ERROR);
            }
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "En moficar los ambientes", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public String cancelarModifiReserva() {
        inicializar();
        return "regresar2";
    }


    // // </editor-fold>
    
}
